const express = require('express');
const jwt = require('jsonwebtoken');
const cors = require('cors');
const bodyParser = require('body-parser');

const app = express();
app.use(cors({ origin: true, credentials: true })); // 允许跨域携带 Cookie
app.use(bodyParser.json());

// 配置：密钥（生产环境需用环境变量存储）、Token 有效期
const JWT_SECRET = 'your_jwt_secret_key'; // 非对称加密建议用 RS256，这里简化用 HS256
const ACCESS_TOKEN_EXPIRES_IN = '15m'; // 访问令牌有效期 15 分钟
const REFRESH_TOKEN_EXPIRES_IN = '7d'; // 刷新令牌有效期 7 天

// 模拟用户数据库
const users = [
  { id: 1, username: 'user1', password: 'pass1' },
  { id: 2, username: 'user2', password: 'pass2' }
];


// 在现有代码顶部添加
const path = require('path');
app.use(express.static(path.join(__dirname, 'public'))); // 托管静态文件

// 修改登录页路由（当GET请求时返回登录页面）
app.get('/login', (req, res) => {
  res.sendFile(path.join(__dirname, 'public', 'login.html'));
});
// 登录接口：验证用户并签发 Token
app.post('/login', (req, res) => {
  const { username, password, redirectUrl } = req.body;
  const user = users.find(u => u.username === username && u.password === password);

  if (!user) {
    return res.status(401).json({ message: '用户名或密码错误' });
  }

  // 生成 Access Token（包含用户标识，无敏感信息）
  const accessToken = jwt.sign(
    { userId: user.id, username: user.username },
    JWT_SECRET,
    { expiresIn: ACCESS_TOKEN_EXPIRES_IN, issuer: 'auth-server' }
  );

  // 生成 Refresh Token（用于刷新 Access Token）
  const refreshToken = jwt.sign(
    { userId: user.id },
    JWT_SECRET,
    { expiresIn: REFRESH_TOKEN_EXPIRES_IN, issuer: 'auth-server' }
  );

  // 将 Refresh Token 存入 Cookie（HttpOnly 防止 XSS）
  res.cookie('refreshToken', refreshToken, {
    httpOnly: true,
    secure: false, // 生产环境需设为 true（仅 HTTPS）
    sameSite: 'lax',
    maxAge: 7 * 24 * 60 * 60 * 1000 // 7 天
  });

  // 登录成功后重定向回原应用
  if (redirectUrl) {
    return res.json({ redirectUrl, accessToken });
  }
  res.json({ accessToken });
});

// 验证 Token 接口（供应用1、2调用）
app.post('/verify-token', (req, res) => {
  const { token } = req.body;
  if (!token) {
    return res.status(401).json({ valid: false, message: 'Token 不存在' });
  }

  try {
    // 验证 Token 签名和有效期
    const decoded = jwt.verify(token, JWT_SECRET, { issuer: 'auth-server' });
    res.json({ valid: true, user: { id: decoded.userId, username: decoded.username } });
  } catch (err) {
    res.status(401).json({ valid: false, message: 'Token 无效或已过期' });
  }
});

// 刷新 Token 接口
app.post('/refresh-token', (req, res) => {
  const refreshToken = req.cookies.refreshToken;
  if (!refreshToken) {
    return res.status(401).json({ message: 'Refresh Token 不存在' });
  }

  try {
    const decoded = jwt.verify(refreshToken, JWT_SECRET, { issuer: 'auth-server' });
    // 生成新的 Access Token
    const newAccessToken = jwt.sign(
      { userId: decoded.userId, username: users.find(u => u.id === decoded.userId).username },
      JWT_SECRET,
      { expiresIn: ACCESS_TOKEN_EXPIRES_IN, issuer: 'auth-server' }
    );
    res.json({ accessToken: newAccessToken });
  } catch (err) {
    res.status(401).json({ message: 'Refresh Token 无效，需重新登录' });
  }
});

// 登出接口（清除 Refresh Token）
app.post('/logout', (req, res) => {
  res.clearCookie('refreshToken');
  res.json({ message: '登出成功' });
});

// 启动服务（端口 3000）
app.listen(3000, () => {
  console.log('认证中心运行在 http://localhost:3000');
});